Estoy modificando el manejo de errores del middleware Express-Validator para pasar por mi middleware de manejo de errores personalizado, pero el mensaje de validationResult se resuelve en [object Object] .
Manejo de errores de Express-Validator
const expressValidationError = (req, res, next) => { const errors = validationResult(req); if (!errors.isEmpty()) { const err = new Error(errors.array()); err.status = 400; next(err); } else { next(); } };Middleware de manejo de errores exprés
app.use((err, req, res, next) => { const status = err.status || 500; res.status(status).json({ error: { status: status, message: err.message || "Internal Server Error", }, }); }); Este es el resultado del objeto de error que se devuelve de validationResult :
Result { formatter: [Function: formatter], errors: [ { value: 'b', msg: 'Username Must be Between 5 to 255 Characters Long!', param: 'username', location: 'body' } ] } Y este es el errors.array() :
[ { value: 'b', msg: 'Username Must be Between 5 to 255 Characters Long!', param: 'username', location: 'body' } ] Sé que solo puedo usar res.status(400).json({ error: errors.array() }); en Express-Validator y evitar todo esto, pero preferiría que se pasara a next() y lo manejara el middleware de error.
¿Hay alguna manera de hacerlo o debo ir por el otro lado?
Si ve el siguiente código, esto es lo que está sucediendo. Estás pasando una matriz de objetos.
let status = new Error([{}]); console.log(status); // Error: [object Object]Ahora, cuando verifica el objeto de validación, es algo como esto:
// errors will be like [{ myLocation: 'body' }, { myLocation: 'query' }...]Todo lo que tienes que hacer es una cadena:
const expressValidationError = (req, res, next) => { const errors = validationResult(req); if (!errors.isEmpty()) { // below is only useful when you don't have array of objects // const err = new Error(errors.array().toString()); const err = new Error(errors.array().map(el => el['msg']).toString()); err.status = 400; next(err); } else { next(); } };Agregar qué clave tiene qué error de validación:
const expressValidationError = (req, res, next) => { const errors = validationResult(req); if (!errors.isEmpty()) { // below is only useful when you don't have array of objects // const err = new Error(errors.array().toString()); const err = new Error(errors.array().map(el => `${el[param]} - has Error: ${el['msg']}`).toString()); err.status = 400; next(err); } else { next(); } };el problema no es el validador, sino que el objeto Error toma un parámetro de cadena como primer parámetro, y le está pasando un objeto (matriz), por lo tanto, el object object .
entonces JSON.stringifica el objeto:
const err = new Error(JSON.stringify(errors.array()));